home *** CD-ROM | disk | FTP | other *** search
/ TPUG - Toronto PET Users Group / TPUG Users Group CD / TPUG Users Group CD.iso / CRS / crs47.d81 / c64hdpro.arc / FORMAT.SRC < prev    next >
Text File  |  2009-10-10  |  11KB  |  497 lines

  1. ;BPUT"FORMAT.SRC"
  2. ;RPUT"FORMAT.SRC"
  3. ;+++++++++++++++++++++++++++++++++
  4. ;+  INITIALIZE THE HARD DISK     +
  5. ;+                               +
  6. ;+ INTERFACES WITH THE BIOS FOR  +
  7. ;+ HARD DRIVE....                +
  8. ;+++++++++++++++++++++++++++++++++
  9. ;
  10. READ = $7000 ;EQUATES FOR BIOS
  11. WRITE = READ+3
  12. RESET = READ+6
  13. SETPRM = READ+9
  14. RECAL = READ+12
  15. SEEK = READ+15
  16. TDREDY = READ+18 ;TEST DRIVE READY
  17. SBDIAG = READ+21 ;SECTOR BUF DIAG
  18. DRDIAG = READ+24 ;DRIVE DIAGS
  19. CTDIAG = READ+27 ;CONTROLLER DIAGS
  20. FBADTK = READ+30 ;FORMAT BAD TRK
  21. FMTTRK = READ+33 ;FORMAT TRACK
  22. FMTDRV = READ+36 ;FORMAT DRIVE
  23. RETPRM = READ+39 ;RETURN PARMS
  24.  ;INPUT - A = DRIVE NUMBER
  25.  ;OUTPUT - A = # HEADS
  26.  ;         X = MSB #CYLS
  27.  ;         Y = LSB #CYLS
  28. RDLONG = READ+42
  29. READSB = READ+45
  30. WRLONG = READ+48
  31. WRITSB = READ+51
  32. VERIFY = READ+54
  33. DCBPTR = READ+57 ;POINTER TO DCB
  34. * = $6000
  35. START = * ;BEGIN FORMAT
  36.  LDA #0 ;CLEAR THE BUFFERS
  37.  TAY
  38. CLEARBADSECTOR STA BADSECTORS,Y
  39.  STA BADSECTORS+256,Y
  40.  STA BADSECTORS+512,Y
  41.  STA BADSECTORS+768,Y
  42.  STA RDBUF,Y
  43.  STA RDBUF+256,Y
  44.  STA WRTBUF,Y
  45.  STA WRTBUF+256,Y
  46.  INY
  47.  BNE CLEARBADSECTOR
  48.  LDA #4 ;2 TIMES # SECTORS FOR BAD SECTORS
  49.  STA BADSECTORCTR
  50.  LDA #<HEADINGMSG ;CLEAR SCREEN,ETC
  51.  JSR WRITEOUTAMSG
  52.  LDA DCBPTR
  53.  STA PTR1
  54.  STA PTRX
  55.  STA DCBPTRFORGET
  56.  LDA DCBPTR+1
  57.  STA PTR2 ;ADDRESS THE DCB
  58.  STA PTRX+1
  59.  STA DCBPTRFORGET+1
  60.  LDA #0 ;SET UP FOR DRIVE 0
  61.  JSR PUTDCBDRIVE ;SET UP DRIVE 0
  62.  JSR RESET
  63.  BCC RESETISOK ;GO IF NO ERROR
  64.  LDA #<RESETERRORMSG ;ISSUE MSG
  65.  JSR WRITEOUTAMSG
  66.  BRK
  67. RESETISOK LDA #0 ;RESTORE DRIVE 0
  68.  JSR PUTDCBDRIVE
  69.  JSR PUTDCBMSBSECTR ;SET SECTOR
  70.  JSR PUTDCBCYLLSB ;AND CYL
  71.  LDA #11 ;INTERLEAVE, TEST SHOWS 11 GOOD
  72.  JSR PUTDCBNUMSECS
  73.  LDA #<BUFFER
  74.  JSR PUTDCBLOBUFPTR
  75.  LDA #>BUFFER
  76.  JSR PUTDCBHIBUFPTR
  77.  JSR RETPRM ;GET THE PARMS
  78.  DEY ;BACK DOWN CYLINDERS BY 1
  79.  BNE SAVETHEPARMS
  80.  DEX
  81. SAVETHEPARMS STX CYLMSB
  82.  STX NUMCYLINDERS ;SAVE
  83.  STY NUMCYLINDERS+1
  84.  STA NUMBEROFHEADS
  85.  STY CYLLSB
  86.  LDA #16 ;SET SECTOR NUMBER TO MAX
  87.  STA SECTOR
  88.  JSR CYLINDER2SECTR ;CONVERT
  89.  LDX SECNUM ;MOVE AND PRIME
  90.  LDA SECNUM+1 ;FOR SECTOR TO SAT
  91.  LDY SECNUM+2 ;CONVERSION
  92.  STX TOTALSECTORS
  93.  STA TOTALSECTORS+1
  94.  STY TOTALSECTORS+2
  95.  JSR SECTOR2SAT ;GO CONVERT
  96.  LDA SATSEC ;SAVE FOR LATER
  97.  STA LASTSATSECTOR
  98.  LDA SATBYT
  99.  STA LASTSATBYTE
  100.  LDA SATBYT+1
  101.  STA LASTSATBYTE+1
  102.  LDA SATBIT
  103.  STA LASTSATBIT
  104. CHECKLOWLEVEL LDA #<LOWLEVELMSG ;ASK ABOUT LOLEVEL
  105.  JSR WRITEOUTAMSG
  106. LOWLEVELANSWER JSR $FFE4
  107.  JSR $FFD2
  108.  CMP #'N' ;NO LOW LEVEL
  109.  BEQ SETUPCOUNTERS
  110.  CMP #'Y' ;DO IT?
  111.  BNE LOWLEVELANSWER
  112.  JSR FMTDRV ;LOW LEVEL IT
  113.  BCC SETUPCOUNTERS
  114.  LDA #<LOWLEVELERRMSG ;ERROR MSG
  115.  JSR WRITEOUTAMSG
  116.  BRK
  117. SETUPCOUNTERS = *
  118.  LDA #0
  119.  STA CYLINDERCOUNTR ;CLEAR COUNTERS
  120.  STA CYLINDERCOUNTR+1
  121.  STA HEADCOUNTER
  122.  STA SECTORCOUNTER
  123.  LDX #0
  124. FILLBUFFER TXA
  125.  STA WRTBUF,X
  126.  STA WRTBUF+256,X
  127.  INX
  128.  BNE FILLBUFFER
  129.  LDA #147
  130.  JSR $FFD2
  131.  LDA #<INTENSIVEMSG ;WHAT KIND?
  132.  JSR WRITEOUTAMSG
  133. INTENSEANSWER JSR $FFE4 ;GET ANSWER
  134.  CMP #'N' ;NOT INTENSIVE
  135.  BEQ NOTINTENSIVE
  136.  CMP #'Y' ;YES?
  137.  BNE INTENSEANSWER
  138.  LDX #0
  139.  .BYT $2C
  140. NOTINTENSIVE LDX #$FF
  141.  STX INTENSIVEFLAG ;SET MODE FLAG
  142.  JSR $FFD2
  143. FORMATDRIVE LDA #5 ;CLEAR RETRY COUNTER
  144.  STA WRTRETRYCOUNTR
  145.  STA RDRETRYCOUNTER
  146.  LDA CYLINDERCOUNTR+1
  147.  JSR HEXTOASCII ;MAKE PRINTABLE
  148.  STA $041E
  149.  STX $041F
  150.  LDA CYLINDERCOUNTR
  151.  JSR HEXTOASCII
  152.  STA $0420
  153.  STX $0421
  154.  LDA #32
  155.  STA $0422
  156.  LDA HEADCOUNTER
  157.  JSR HEXTOASCII
  158.  STA $0423
  159.  STX $0424
  160.  LDA #32
  161.  STA $0425
  162.  LDA SECTORCOUNTER
  163.  JSR HEXTOASCII
  164.  STA $0426
  165.  STX $0427
  166.  JSR SETUPDCB ;SET UP DCB
  167.  LDA INTENSIVEFLAG ;CHECK FOR INTENSE FORMAT
  168.  BNE BYPASSWRITE ;BYPASS WRITE
  169.  LDA #<WRTBUF
  170.  JSR PUTDCBLOBUFPTR
  171.  LDA #>WRTBUF
  172.  JSR PUTDCBHIBUFPTR
  173. WRITEASECTOR JSR WRITE ;GO WRITE A BLOCK
  174.  BCC BYPASSWRITE
  175.  JSR READTHESENSE ;RETRIEVE SENSE
  176.  JSR WRITEOUTSENSE
  177.  JSR RESETFORRETRY ; SET UP FOR RETRY
  178.  DEC WRTRETRYCOUNTR
  179.  BNE WRITEASECTOR
  180.  LDA #<WRITEERRORMSG ;WRITE ERROR
  181.  JSR WRITEOUTAMSG
  182.  JSR MARKBADSECTOR ;MARK AS BAD
  183.  JMP ONTONEXTSECTOR ;GO TO NEXT SECTOR
  184. BYPASSWRITE LDA #<RDBUF
  185.  JSR PUTDCBLOBUFPTR
  186.  LDA #>RDBUF
  187.  JSR PUTDCBHIBUFPTR
  188. READASECTOR JSR READ
  189.  BCC ISITINTENSIVE
  190.  JSR READTHESENSE ;RETRIEVE SENSE
  191.  JSR WRITEOUTSENSE
  192.  LDA #<RDERRORMSG ;READ ERROR
  193. READRETRY PHA ;SAVE MSG NUMBER
  194.  JSR RESETFORRETRY ;SET UP FOR RETRY
  195.  PLA ;RETRIEVE MSG NUMBER
  196.  DEC RDRETRYCOUNTER ;CHECK FOR MAX NUM
  197.  BNE READASECTOR
  198.  JSR WRITEOUTAMSG
  199.  JSR MARKBADSECTOR
  200.  JMP ONTONEXTSECTOR
  201. ISITINTENSIVE LDA INTENSIVEFLAG ;CHECK FOR INSTENSE
  202.  BNE ONTONEXTSECTOR ;BYPASS COMPARE
  203.  LDY #0 ;SET UP FOR COMPARE
  204. COMPARESECTORS LDA WRTBUF,Y
  205.  CMP RDBUF,Y
  206.  BNE BADCOMPARE
  207.  LDA WRTBUF+256,Y
  208.  CMP RDBUF+256,Y
  209.  BEQ COMPARENEXT
  210. BADCOMPARE LDA #<COMPAREERRMSG
  211.  BNE READRETRY
  212. COMPARENEXT INY
  213.  BNE COMPARESECTORS
  214. ONTONEXTSECTOR LDX SECTORCOUNTER ;CHECK SECTOR
  215.  INX
  216.  CPX #17
  217.  BNE BUMPTHEHEAD
  218.  LDX #0
  219. BUMPTHEHEAD STX SECTORCOUNTER ;SAVE SECTOR
  220.  BNE GOTNEWADDRESS ;GO ON IF BELOW
  221.  LDX HEADCOUNTER ;BUMP TO NEXT HEAD
  222.  INX
  223.  CPX NUMBEROFHEADS ;AT MAX?
  224.  BNE SAVEHEADCOUNT
  225.  LDX #0
  226. SAVEHEADCOUNT STX HEADCOUNTER
  227.  BNE GOTNEWADDRESS
  228.  LDA $DC0B ;GET HRS STOP CLOCK
  229.  LDA $DC09 ;GET SECONDS
  230.  JSR HEXTOASCII
  231.  STA $410
  232.  STX $411
  233.  LDA #':'
  234.  STA $412
  235.  LDA $DC08
  236.  JSR HEXTOASCII
  237.  STX $0413
  238.  STA $0414
  239.  LDA $DC0F
  240.  AND #$7F
  241.  STA $DC0F
  242.  LDA #$00
  243.  LDX #4
  244. SETTIMETOZERO STA $DC08,X
  245.  DEX
  246.  BPL SETTIMETOZERO
  247.  LDX CYLINDERCOUNTR ;CHECK FOR END
  248.  CPX NUMCYLINDERS
  249.  BNE BUMPCYLINDERLO
  250.  LDX CYLINDERCOUNTR+1
  251.  CPX NUMCYLINDERS+1
  252.  BEQ ENDOFFORMAT
  253. BUMPCYLINDERLO INC CYLINDERCOUNTR ;BUMP BY ONE
  254.  BEQ BUMPCYLINDERHI
  255. GOTNEWADDRESS JMP FORMATDRIVE
  256. BUMPCYLINDERHI INC CYLINDERCOUNTR+1
  257.  JMP FORMATDRIVE
  258. ENDOFFORMAT LDA #<ENDOFJOBMSG
  259.  JSR WRITEOUTAMSG
  260.  BRK
  261. ;
  262. ;+++++++++++++++++++++++++++++++++
  263. ;+     SET DCB FIELD             +
  264. ;+                               +
  265. ;+ INPUT  - A = BYTE TO PUT      +
  266. ;+          X = OFFSET IN DCB    +
  267. ;+++++++++++++++++++++++++++++++++
  268. ;
  269. PUTDCBCOMMAND LDX #0 ;OFFSET 0
  270.  .BYT $2C ;BIT
  271. PUTDCBHEAD = * ;SAME AS PUT DRIVE
  272. PUTDCBDRIVE LDX #1 ;OFFSET 1
  273.  .BYT $2C ;BIT
  274. PUTDCBMSBSECTR LDX #2 ;OFFSET 2
  275.  .BYT $2C ;BIT
  276. PUTDCBCYLLSB LDX #3 ;OFFSET 3
  277.  .BYT $2C ;BIT
  278. PUTDCBNUMSECS LDX #4 ;OFFSET 4
  279.  .BYT $2C ;BIT
  280. PUTDCBSTEP LDX #5 ;OFFSET 5
  281.  .BYT $2C ;BIT
  282. PUTDCBLOBUFPTR LDX #6 ;OFFSET 6
  283.  .BYT $2C ;BIT
  284. PUTDCBHIBUFPTR LDX #7 ;OFFSET 7
  285. PUTDCB STA PUTDCB,X
  286. PTR1 = PUTDCB+1
  287. PTR2 = PUTDCB+2
  288.  RTS ; SHORT AND SWEET??
  289. ;
  290. READTHESENSE LDY #12 ;OFFSET TO SENSE
  291.  STA ERRORCODE ;SAVE ERROR CODE
  292.  LDX #0
  293. GETALLTHESENSE LDA GETALLTHESENSE,Y
  294. PTRX = GETALLTHESENSE+1
  295.  STA CURRENTSENSE,X ;PUT IN BUFFER
  296.  INX
  297.  INY
  298.  CPX #4
  299.  BNE GETALLTHESENSE
  300.  RTS
  301. ;
  302. GETDCBCOMMAND LDY #0
  303.  .BYT $2C
  304. GETDCBHEAD LDY #1
  305.  .BYT $2C
  306. GETDCBSECTOR LDY #2
  307.  .BYT $2C
  308. GETDCBCYLLSB LDY #3
  309. ;
  310. GETDCBINFO LDA GETDCBINFO,Y ;Y HAS OFFSET
  311. DCBPTRFORGET = GETDCBINFO+1
  312.  RTS
  313. ;
  314. ;
  315. WRITEOUTHEX PHA
  316.  AND #$F0 ;HIGH NYBLE FIRST
  317.  LSR A
  318.  LSR A
  319.  LSR A
  320.  LSR A
  321.  JSR ISITATHRUF
  322.  PLA
  323.  AND #$0F
  324. ISITATHRUF CMP #$0A
  325.  BCC ADDASCIIZERO
  326.  ADC #6 ;ADD SEVEN
  327. ADDASCIIZERO ADC #$30
  328.  JMP $FFD2
  329. HEXTOASCII PHA
  330.  AND #$0F ;GET LOW NYBLE
  331.  JSR BIGGERTHAN9
  332.  TAX
  333.  PLA
  334.  AND #$F0 ;NOW HI NYBLE
  335.  LSR A
  336.  LSR A
  337.  LSR A
  338.  LSR A
  339. BIGGERTHAN9 CMP #$0A
  340.  BCC ADDAZERO
  341.  SBC #9
  342.  RTS
  343.  ADC #6 ;ADD SEVEN
  344. ADDAZERO ADC #$30
  345.  RTS
  346. ;
  347. WRITEOUTSENSE LDY #0
  348. WRITEALLSENSE LDA ERRORCODE,Y ;GET ERRORCODE AND SENSE
  349.  JSR WRITEOUTHEX ;WRITE IT
  350.  LDA #32
  351.  JSR $FFD2
  352.  INY
  353.  CPY #5 ;GOT EM ALL?
  354.  BNE WRITEALLSENSE
  355.  LDA #13
  356.  JMP $FFD2
  357. ;
  358. WRITEOUTAMSG TAX ;GET INDEX INTO TABLE
  359.  LDA MTAB,X
  360.  STA MPTR
  361.  LDA MTAB+1,X
  362.  STA MPTR+1
  363.  LDY #0
  364. WRITEMSGLOOP LDA WRITEMSGLOOP,Y
  365. MPTR = WRITEMSGLOOP+1
  366.  BEQ ENDOFMESSAGE
  367.  JSR $FFD2
  368.  INY
  369.  BNE WRITEMSGLOOP
  370. ENDOFMESSAGE RTS
  371. ;
  372. RESETFORRETRY JSR RESET
  373. SETUPDCB LDA HEADCOUNTER ;SET HEAD NUMBER
  374.  JSR PUTDCBHEAD ;PUT HEAD # IN DCB
  375.  LDA CYLINDERCOUNTR+1 ;GET CYL #HI
  376.  ASL A ;MOVE TO HIGH BITS
  377.  ASL A
  378.  ASL A
  379.  ASL A
  380.  ASL A
  381.  ASL A
  382.  ORA SECTORCOUNTER
  383.  JSR PUTDCBMSBSECTR ;MSB CYL AND SECTOR
  384.  LDA CYLINDERCOUNTR ;LSB CYL
  385.  JSR PUTDCBCYLLSB
  386.  LDA #1 ;SET NUM BLOCKS
  387.  JMP PUTDCBNUMSECS
  388. ;
  389. MARKBADSECTOR JSR GETDCBHEAD
  390.  AND #$0F ;CLEAR DRIVE NUMBER
  391.  JSR PUTBADSECTOR
  392.  JSR GETDCBSECTOR
  393.  JSR PUTBADSECTOR
  394.  JSR GETDCBCYLLSB
  395.  JSR PUTBADSECTOR
  396.  RTS
  397. PUTBADSECTOR STA BADSECTORS
  398.  INC PUTBADSECTOR+1
  399.  BNE PUTBADSECEND
  400.  INC PUTBADSECTOR+2
  401.  DEC BADSECTORCTR ;BACK OFF USED SPACE
  402.  BNE PUTBADSECEND
  403.  LDA #<TOOMANYBAD ;TOO MANY BAD SECTORS
  404.  JSR WRITEOUTAMSG
  405.  PLA ;TERMINATE NOW!
  406.  PLA ;BY PULLING OFF THE RETURN
  407.  PLA ;TWICE
  408.  PLA
  409. PUTBADSECEND RTS
  410. ;
  411. .LIB C2SEC14.SRC
  412. ;
  413. ;+++ MESSAGE TABLE +++
  414. MTAB = *
  415. HEADINGMSG = *-MTAB
  416.  .WOR HEADER
  417. RESETERRORMSG = *-MTAB
  418.  .WOR RESETE ;ERROR ON RESET
  419. TOOMANYBAD = *-MTAB
  420.  .WOR TOOMANYBADMSG
  421. LOWLEVELMSG = *-MTAB
  422.  .WOR LOWLVL
  423. LOWLEVELERRMSG = *-MTAB
  424.  .WOR LOWERR ;ERROR ON LOW LEVEL
  425. WRITEERRORMSG = *-MTAB
  426.  .WOR WRTERR ;WRITE ERROR
  427. RDERRORMSG = *-MTAB
  428.  .WOR READER ;READ ERROR
  429. ENDOFJOBMSG = *-MTAB
  430.  .WOR FINISH ;END OF JOB MSG
  431. COMPAREERRMSG = *-MTAB
  432.  .WOR COMERR ;COMPARE ERROR MSG
  433. INTENSIVEMSG = *-MTAB
  434.  .WOR HOWMSG ;WHAT KIND OF FORMAT
  435. NUMCYLSMSG = *-MTAB
  436.  .WOR INPUTNUMCYLS ;TOTAL NUMBER OF CYLS MSG
  437. NUMHEADSMSG = *-MTAB
  438.  .WOR INPUTNUMHEADS
  439. REDUCEDWRTMSG = *-MTAB
  440.  .WOR INPUTREDUCED
  441. PRECOMPMSG = *-MTAB
  442.  .WOR INPUTPRECOMP
  443. BURSTLENMSG = *-MTAB
  444.  .WOR INPUTBURSTLEN
  445. STEPRATEMSG = *-MTAB
  446.  .WOR INPUTSTEPRATE
  447. ;
  448. HEADER .BYT 147,'HARD DISK FORMATER',13,13,0
  449. RESETE .BYT 13,'E R R O R ON RESET COMMAND',13,0
  450. LOWLVL .BYT 13,'DO LOW LEVEL FORMAT? '
  451.  .BYT '(Y OR N)',13,0
  452. LOWERR .BYT 13,'E R R O R ON LOW LEVEL',13,0
  453. WRTERR .BYT 13,'WRITE ERROR',13,0
  454. TOOMANYBADMSG .BYT 13,'TOO MANY BAD SECTORS '
  455.  .BYT 'FORMAT TERMINATED!!!',13,0
  456. READER .BYT 13,'READ ERROR',13,0
  457. FINISH .BYT 13,'END OF FORMAT',13,0
  458. COMERR .BYT 13,'BLOCK COMPARE ERROR',13,0
  459. HOWMSG .BYT 13,13,'DO INTENSIVE FORMAT?'
  460.  .BYT ' <Y OR N> ',0
  461. INPUTNUMCYLS .BYT 13,'ENTER TOTAL NUMBER OF'
  462.  .BYT ' CYLINDERS ',0
  463. INPUTNUMHEADS .BYT 13,'ENTER NUMBER OF HEADS ',0
  464. INPUTPRECOMP .BYT 13,'CYLINDER NUMBER '
  465.  .BYT 'FOR START PRECOMP ',0
  466. INPUTREDUCED .BYT 13,'CYLINDER NUMBER '
  467.  .BYT 'FOR REDUCED WRITE CURRENT ',0
  468. INPUTBURSTLEN .BYT 13,'MAX CORRECTABLE ERROR '
  469.  .BYT 'BURST LENGTH (5 - 11) ',0
  470. INPUTSTEPRATE .BYT 13,'STEP RATE ',0
  471. INTENSIVEFLAG .BYT 0 ;INTENSE FLAG
  472. HEADCOUNTER .BYT 0 ;COUNT UP HEAD
  473. CYLINDERCOUNTR .WOR 0 ;COUNT UP CYLINDERS
  474. SECTORCOUNTER .BYT 0 ;SECTOR COUNTER
  475. RDRETRYCOUNTER .BYT 0
  476. WRTRETRYCOUNTR .BYT 0
  477. BADSECTORCTR .BYT 0 ;COUNTER FOR SECTORS SECTOR
  478. ERRORCODE .BYT 0
  479. CURRENTSENSE .BYT 0,0,0,0
  480. ;+ STORAGE AREA
  481. BUFFER .WOR 0
  482.  .BYT 'CALCULATED VALUES'
  483. TOTALSECTORS .BYT 0,0,0 ;TOTAL SECTORS
  484. LASTSATSECTOR .BYT 0 ;LAST SAT SECTOR NUMBER
  485. LASTSATBYTE .WOR 0 ;BYTE OFFSET OF LAST SAT BYTE
  486. LASTSATBIT .BYT 0 ;BIT OF LAST BYTE
  487. SECTORPERCYL .WOR 0 ;NUMBER SECTORS/CYL
  488. NUMBEROFHEADS .BYT 0 ;NUMBER HEADS
  489. NUMCYLINDERS .WOR 0 ;NUMBER CYLINDERS
  490. * = BUFFER+512
  491. RDBUF = *
  492. * = RDBUF+512
  493. WRTBUF = *
  494. * = WRTBUF+512
  495. BADSECTORS = *
  496. * = BADSECTORS+1024
  497. .END